package com.example.demo.controller; // 定义控制器所在的包

import com.example.demo.entity.Student; // 导入学生实体类
import com.example.demo.service.StudentService; // 导入学生服务接口
import org.springframework.beans.factory.annotation.Autowired; // 导入自动注入注解
import org.springframework.web.bind.annotation.*; // 导入Web请求相关注解
import java.util.List; // 导入List集合类
import com.example.demo.common.Result; // 导入统一响应结果类

/**
 * 学生管理控制器
 * 处理与学生相关的HTTP请求，提供RESTful API接口
 * 基础路径: /api/students
 */
@RestController // 标识这是一个REST风格的控制器
@RequestMapping("/api/students") // 设置基础请求路径为/api/students
public class StudentController { // 学生管理控制器类

    /**
     * 注入学生服务层接口
     */
    @Autowired // 自动注入StudentService实例
    private StudentService studentService; // 学生服务接口实例

    /**
     * 获取所有学生信息
     * @return Result<List<Student>> 包含所有学生信息的列表
     */
    @GetMapping // GET请求映射，获取所有学生信息
    public Result<List<Student>> findAll() { // 查询所有学生信息的方法
        return Result.success(studentService.findAll()); // 调用服务层查询所有学生并返回成功响应
    }

    /**
     * 根据ID查询特定学生信息
     * @param id 学生ID
     * @return Result<Student> 包含查询到的学生信息
     */
    @GetMapping("/{id}") // GET请求映射，根据ID查询学生
    public Result<Student> findById(@PathVariable Long id) { // 根据ID查询学生信息的方法
        return Result.success(studentService.findById(id)); // 调用服务层查询指定ID的学生并返回成功响应
    }

    /**
     * 新增学生信息
     * @param student 要添加的学生信息对象
     * @return Result<Void> 操作结果
     */
    @PostMapping // POST请求映射，新增学生信息
    public Result<Void> insert(@RequestBody Student student) { // 新增学生信息的方法
        studentService.insert(student); // 调用服务层新增学生信息
        return Result.success(); // 返回成功响应
    }

    /**
     * 更新学生信息
     * @param id 要更新的学生ID
     * @param student 更新后的学生信息对象
     * @return Result<Void> 操作结果
     */
    @PutMapping("/{id}") // PUT请求映射，更新学生信息
    public Result<Void> update(@PathVariable Long id, @RequestBody Student student) { // 更新学生信息的方法
        student.setId(id); // 设置要更新的学生ID
        studentService.update(student); // 调用服务层更新学生信息
        return Result.success(); // 返回成功响应
    }

    /**
     * 删除学生信息
     * @param id 要删除的学生ID
     * @return Result<Void> 操作结果
     */
    @DeleteMapping("/{id}") // DELETE请求映射，删除学生信息
    public Result<Void> delete(@PathVariable Long id) { // 删除学生信息的方法
        studentService.delete(id); // 调用服务层删除学生信息
        return Result.success(); // 返回成功响应
    }
}